import axios from 'axios'
import { ElMessage } from 'element-plus' //这里需要额外引入，因为这里不是在组件中，所以无法直接使用this.$message
const http=axios.create({
    // `baseURL` 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL。
    // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
    baseURL: 'https:/v3pz.itndedu.com/v3pz',
    timeout: 5000 // 请求超时时间
})

//添加拦截器
//它允许我们在请求或响应被处理之前拦截它们。拦截器可以用于在请求发送之前修改请求，或者在响应到达之前修改响应。
//下面的代码完全是在aixos官方文档上面粘贴的模板，自己进行修改
//新知识点：什么是token
//Token 是一种用于身份验证的机制，通常用于确保用户身份的合法性和安全性。
//Token 可以是任何形式的字符串，但通常是一个加密的字符串，包含了用户的身份信息和一些其他的信息。
// 在 JavaScript 中，可以使用 localStorage 或 sessionStorage 来存储 Token，也可以使用 HTTP 请求头将 Token 添加到请求中。
//在请求拦截器中，我们可以在请求发送之前，将 Token 添加到请求头中，以便服务器验证用户的身份。
//!!!!之前一直没有修好的问题在于我们这里创建的是axios实例使用“http”进行命名，而之前在组件中我们使用的是“axios”进行命名，导致我们无法获取到token
http.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    const token=localStorage.getItem('pz_token')
    //不需要添加token的接口，获取验证码我们就不需要进行验证
    //填入不需要验证的接口：获取验证码、登录接口、验证码的验证接口
    const whiteURL = ['/get/code','/login', '/user/authentication'];
    if (token&&!whiteURL.includes(config.url)) {//如果说token存在并且请求的地址不在白名单中，那么就添加token
      config.headers['x-token'] = token; //config.headers['x-token'] = token;这行代码将token的值赋给headers对象中的x-token属性。
    }
    return config;
  }, function (error) {
    // 对请求错误做些什么
    console.log("出现错误")
    return Promise.reject(error); 
  });



// 添加响应拦截器
http.interceptors.response.use(function (response) {
    //对接口异常的数据，给用户提示
    if(response.data.code ===-1){
        ElMessage.error(response.data.message)
    }
    //当后端返回-2（登录过期或者token值改变）
    if(response.data.code ===-2){
        localStorage.removeItem('pz_token');//移除token信息
        localStorage.removeItem('pz_userInfo');//移除用户信息
        console.log("token过期，请重新登录")
        //下面代码的意思就是window.location.href将当前页面的URL设置为window.location.origin的值，从而实现页面的跳转。
        window.Location.herf=window.location.origin//实现页面的跳转，回到登录页面
    }
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  });

  export default http //实例对外进行暴露，这就是对aixos的二次封装